﻿using System;
using System.Collections.Generic;
using System.Linq;
using kk.components.contracts;
using kk.messages.contracts.DataModel;
using kk.messages.contracts.ViewModel;

namespace kk.belegungsplan.factory {
    public class BelegungsplanFactory : IBelegungsplanFactory{

        public void BelegungsplanZuVorstellung(Request<Vorstellung, Belegungsplan> request) {

            Saalplan saalplan = OnBestuhlungZuSaalplan.Request<string, Saalplan>(request.RequestData.Saal).Return();
            IEnumerable<Preiskategorie> preiskategorie = OnPreiskategorien.Request<IEnumerable<Preiskategorie>>().Return();
            IEnumerable<Platzposition> belegtePlätze = OnBelegungenZuVorstellung.Request<Vorstellung, IEnumerable<Platzposition>>(request.RequestData).Return();

            request.ResponsePin(new Belegungsplan(
                from platz in saalplan.Plätze
                select
                    new Platzbelegung(platz.Platzposition,
                                      preiskategorie.Where(pk => pk.KategorieSchlüssel == platz.PreiskategorieSchlüssel).
                                          First(),
                                      belegtePlätze.Contains(platz.Platzposition))
                ));
        }

        public event Action<Request<string, Saalplan>> OnBestuhlungZuSaalplan;
        public event Action<Request<IEnumerable<Preiskategorie>>> OnPreiskategorien;
        public event Action<Request<Vorstellung, IEnumerable<Platzposition>>> OnBelegungenZuVorstellung;

    }
}
